from collections import OrderedDict

from django.template import loader

from .models import GoodsChannel, GoodsCategory, ContentCategory, Content
from django.conf import settings
import os


def generate_static_index_html():

# =====================生成上面字典格式数据=======================
    # 第一部分： 从数据库中取数据
    # 定义一个有序字典
    categories = OrderedDict()

    # 对 GoodsChannel 进行 group_id 和 sequence 排序， 获取排序后的结果
    channels = GoodsChannel.objects.order_by('group_id',
                                             'sequence')
    # 遍历排序后的结果： 得到所有的一级菜单
    for channel in channels:
        group_id = channel.group_id
        if group_id not in categories:
            categories[group_id] = {
                'channels': [],
                'sub_cats': []
            }

        cat1 = channel.category

        # 给刚刚创造的字典中，追加具体的分类的名称
        # 即， 给'channels' 后面的[] 里面添加如下的信息
        categories[group_id]['channels'].append({
            'id': cat1.id,
            'name': cat1.name,
            'url': channel.url
        })

        # 根据 cat1 的外键反向，获取下一级（二级菜单）的所有分类数据，并遍历：
        cat2s = GoodsCategory.objects.filter(parent=cat1)
        # cat1.goodscategory_set.all()
        for cat2 in cat2s:

            cat3s = cat2.subs.all()
            sub_cats = []
            for cat3 in cat3s:
                sub_cats.append({
                    'id': cat3.id,
                    'name': cat3.name
                })


            categories[group_id]['sub_cats'].append({
                'id': cat2.id,
                'name': cat2.name,
                'sub_cats': sub_cats
            })


# 我们定义一个字典, 里面将要存储广告内容部分:
    contents = {}
    # 从 ContentCategory 模型类中获取所有数据, 存放到 content_categories 中:
    content_categories = ContentCategory.objects.all()
    # 遍历刚刚获取的所有数据: 拿到每一个广告分类 cat:
    for cat in content_categories:
        # 根据广告分类的 外键反向
        # 获取广告内容中状态为 True 并且按 sequence 排序的部分,
        # 赋值给上面定义的字典, 快捷键(cat.key) 作为 key, 排序的部分作为value
        contents[cat.key] = Content.objects.filter(category=cat,
                                                   status=True).order_by('sequence')


    # 第二部分: 模板渲染部分:
    # 把上面两部分获取的有序字典和字典作为变量,拼接新的字典 context
    context = {
        'categories': categories,
        'contents': contents
    }

    # =====================获取模板,把数据添加进去生成页面====================
    # 根据导入的 loader 获取 'index.html' 模板
    template = loader.get_template('index.html')

    # 拿到模板, 然后将 context 渲染到模板中, 生成渲染过的模板
    html_text = template.render(context)

    # 我们拼接新的 index.html 模板将要生成的所在地地址:
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'index.html')

    # 以写的权限,将渲染过的模板重新生成, 写入到文件中.
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(html_text)